'use strict';
const {
  Model
} = require('sequelize');
const moment = require("moment")
moment.locale('zh-cn')
module.exports = (sequelize, DataTypes) => {
  class Post extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
      models.Post.belongsTo(models.User, { as: 'user' })
      models.Post.hasMany(models.Comment, {as: 'comments'})
      models.Post.belongsToMany(models.Tag, {
        through: models.PostTag,
        foreignKey: 'postId',
        as: "beTag"
      })
    }
  }
  Post.init({
    title: {
      type: DataTypes.STRING,
      allowNull: false,
      validate: {
        notNull: {msg: '标题必须填写'},
        notEmpty: {msg: '标题不能为空'},
        len: {args: [6, 45], msg: '长度必须是6~45之间'},
      }
    },
    content: {
      type: DataTypes.TEXT,
      allowNull: false,
      validate: {
        notNull: {msg: '内容必须填写'},
        notEmpty: {msg: '内容不能为空'}
      }
    },
    cover: {
      type: DataTypes.STRING,
      get() {
        return `${process.env.HOST}:${process.env.PORT}${this.getDataValue('cover')}`
      }
    },
    userId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      validate: {
        notNull: {msg: '用户ID必须填写'},
        notEmpty: {msg: '用户ID不能为空'},
        async isPresent(value) {
          const user = await sequelize.models.User.findByPk(value)
          if (!user) {
            throw new Error(`ID为：${value} 的用户不存在。`);
          }
        }
      }
    },
    categoryId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      validate: {
        notNull: {msg: '分类ID必须填写'},
        notEmpty: {msg: '分类ID不能为空'},
        async isPresent(value) {
          const user = await sequelize.models.User.findByPk(value)
          if (!user) {
            throw new Error(`ID为：${value} 的分类不存在。`);
          }
        }
      }
    },
    status: DataTypes.BOOLEAN,
    createdAt: {
      type: DataTypes.DATE,
      get() {
        return moment(this.getDataValue('createdAt')).format("LL")
      }
    },
    updatedAt: {
      type: DataTypes.DATE,
      get() {
        return moment(this.getDataValue('updatedAt')).format("LL")
      }
    }
  }, {
    sequelize,
    modelName: 'Post',
  });
  return Post;
};